﻿#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    manager = new QNetworkAccessManager(this);
    ui->progressBar->hide();
}

MainWindow::~MainWindow()
{
    delete ui;
}

/*****************************网络请求函数的实现*************************************
 *这里使用了get()函数来发送网络请求，然后进行了QNetworkReply对象的几个信号和自定义槽的关联。
 * 其中readyRead()信号继承自QIODevice类，每当有新的数据可以读取时，都会发射该信号；
 * 每当网络请求的下载进度更新时都会发射downloadProgress()信号，它用来更新进度条；
 * 每当应答处理结束时，都会发射finished()信号
 *******************************************************************************/
void MainWindow::startRequest(QUrl url)
{
    reply = manager->get(QNetworkRequest(url));
    connect(reply, SIGNAL(readyRead()), this, SLOT(httpReadyRead()));

    connect(reply, SIGNAL(downloadProgress(qint64, qint64)),
            this, SLOT(updateDataReadProgress(qint64, qint64)));

    connect(reply, SIGNAL(finished()), this, SLOT(httpFinished()));
}

//这里先判断是否创建了文件，如果是，则读取返回的所有数据，然后写入到文件。该文件是在后面的“下载”按钮单击信号槽中创建并打开的。
void MainWindow::httpReadyRead()
{
    if (file) file->write(reply->readAll());
}

//这里设置了一下进度条的最大值和当前值
void MainWindow::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes)
{
    ui->progressBar->setMaximum(totalBytes);
    ui->progressBar->setValue(bytesRead);
}

//当完成下载后，重新隐藏进度条，然后删除reply和file对象。
void MainWindow::httpFinished()
{
    ui->progressBar->hide();
    file->flush();
    file->close();
    reply->deleteLater();
    reply = 0;
    delete file;
    file = 0;
}

//这里使用要下载的文件名创建了本地文件，然后使用输入的url进行了网络请求，并显示进度条。
void MainWindow::on_pushButton_clicked()
{
    url = ui->lineEdit->text();
    QFileInfo info(url.path());
    QString fileName(info.fileName());
    if (fileName.isEmpty()) fileName = "index.html";
    file = new QFile(fileName);
    if(!file->open(QIODevice::WriteOnly))
    {
        qDebug() << "file open error";
        delete file;
        file = 0;
        return;
    }
    startRequest(url);
    ui->progressBar->setValue(0);
    ui->progressBar->show();
}
